import browser from './browser'

const SDK = {
  // Android 容器暴露给 JSSDK 的对象名称，默认为 Xlink
  androidObjName: 'xLinkBLE',

  // iOS 容器自定义协议名称，默认为 ios
  customProtocolScheme: 'ios',

  /**
   * 配置
   * @param  {Object} params 参数 {[androidObjName], [customProtocolScheme]}
   */
  config (params) {
    params = params || {}
    this.androidObjName = params.androidObjName || 'Xlink'
    this.customProtocolScheme = params.customProtocolScheme || 'ios'
  },

  /**
   * 触发事件
   * @param  {String}   name   事件名称
   * @param  {Object}   params 参数
   * @param  {Function} fn     回调函数
   * @param  {Boolean} hasCallBack     是否需要回调的标志位  最后一位
   */
  fire (name, params, fn, hasCallBack) {
    var _name, _params, _fn
    var _hasCallBack = true
    var _callbackName = ''

    // 判断当前函数需不需要回调

    for (let key in arguments) {
      let argument = arguments[key]
      if (typeof argument === 'boolean') {
        _hasCallBack = !(argument === false)
      }
    }
    // 格式化传入的参数
    for (let key in arguments) {
      let argument = arguments[key]

      if (typeof argument === 'string') {
        _name = argument
      } else if (typeof argument === 'object') {
        _params = JSON.stringify(argument)
      } else if (typeof argument === 'function') {
        if (_hasCallBack) {
          _fn = argument
          var timestamp = new Date().getTime()
          _callbackName = name + '_callback' + timestamp
          window[_callbackName] = _fn
        }
      }
    }

    // 调用接口逻辑
    if (browser.versions.ios) {
      // ios
      let src = this.customProtocolScheme + '://' + _name
      if (_params) {
        src += '?' + _params
      }
      if (_callbackName) {
        src += '?' + _callbackName
      }
      IOSHttp(src)
    } else if (browser.versions.android) {
      // 安卓
      if (_params) {
        if (_callbackName) {
          window[this.androidObjName][_name](_params, _callbackName)
        } else {
          window[this.androidObjName][_name](_params)
        }
      } else {
        if (_callbackName) {
          window[this.androidObjName][_name](_callbackName)
        } else {
          window[this.androidObjName][_name]()
        }
      }
    }
    return this
  },

  /**
   * 监听事件
   * @param  {String}   name   事件名称
   * @param  {Function} fn     回调函数
   */
  on (name, fn) {
    window[name] = fn
    return this
  }
}

/**
 * ios请求
 * @param {[type]} src [description]
 */
function IOSHttp (src) {
  var WVJBIframe = document.createElement('iframe')
  WVJBIframe.style.display = 'none'
  WVJBIframe.src = src
  document.documentElement.appendChild(WVJBIframe)
  setTimeout(function () { document.documentElement.removeChild(WVJBIframe) }, 0)
}

// 将当前方法挂到window上
if (!window.XlinkJSSDK) {
  window.XlinkJSSDK = SDK
}
export default SDK
